package net.oschina.esb.util;

import org.apache.commons.lang3.StringUtils;

/**
 * 通用工具类
 *
 * @author Arvin
 * @time 2017/12/12 21:18
 */
public abstract class GenericUtil {

    /**
     * 首字母小写
     *
     * @param value 字符串
     * @return
     */
    public static String firstLetterToLowerCase(String value) {
        if (StringUtils.isBlank(value)) {
            return value;
        }
        if (value.length() == 1) {
            return value.toLowerCase();
        }

        return String.valueOf(value.charAt(0)).toLowerCase() + value.substring(1);
    }

    /**
     * 首字母大写
     *
     * @param value 字符串
     * @return
     */
    public static String firstLetterToUpperCase(String value) {
        if (StringUtils.isBlank(value)) {
            return value;
        }
        if (value.length() == 1) {
            return value.toUpperCase();
        }

        return String.valueOf(value.charAt(0)).toUpperCase() + value.substring(1);
    }

    /** 下划线 */
    public static final String UNDERLINE = "_";

    /**
     * 将下划线转换成驼峰， 并且首字母小写
     *
     * @param value                要转换的字符串
     * @param firstLetterLowerCase 首字母是否小写
     * @return 返回驼峰格式的字符串
     */
    public static String underlineToHump(String value, boolean firstLetterLowerCase) {
        if (StringUtils.isNotBlank(value)) {
            String resultValue = value;
            if (resultValue.contains(UNDERLINE)) {
                String[] array = value.split(UNDERLINE);
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < array.length; ++i) {
                    String sub = array[i];
                    if (i > 0) {
                        sub = String.valueOf(sub.charAt(0)).toUpperCase() + sub.substring(1);
                    }
                    builder.append(sub);
                }
                resultValue = builder.toString();
            }
            if (firstLetterLowerCase) {
                return firstLetterToLowerCase(resultValue);
            }
        }
        return value;
    }

    /**
     * 驼峰转 下划线分割
     *
     * @param value 要转换的字符串
     * @return 返回下划线格式的字符串
     */
    public static String humpToUnderline(String value) {
        return firstLetterToLowerCase(value).replaceAll("([A-Z]+)", "_$1").toLowerCase();
    }

    /**
     * 检测给定的字符串任意一个是否是 blank
     *
     * @param strings 字符串列表
     * @return 如果给定的字符串有一个是blank的则返回true，所有都不为空才返回false
     */
    public static boolean isAnyBlank(CharSequence... strings) {

        if (strings == null || strings.length < 1) {
            return true;
        }

        for (final CharSequence string : strings) {
            if (StringUtils.isBlank(string)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 检查给定的字符串列表是否全部不是 blank
     *
     * @param strings 要检测的字符串列表
     * @return 如果有一个字符串为空则返回false，否则返回true
     */
    public static boolean isAllNotBlank(CharSequence... strings) {

        if (strings == null || strings.length < 1) {
            return false;
        }

        for (final CharSequence string : strings) {
            if (StringUtils.isBlank(string)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 连接字符串, 默认中间没有分隔符
     *
     * @param nullToIgnore 是否忽略 null 对象, false 的话会转换成 "null" 再拼接
     * @param objects      对象列表
     * @return 返回连接好的字符串
     */
    public static String concat(boolean nullToIgnore, Object... objects) {
        return concat(nullToIgnore, "", objects);
    }

    /**
     * 连接字符串
     *
     * @param nullToIgnore 是否忽略 null 对象, false 的话会转换成 "null" 再拼接
     * @param separator    分隔符
     * @param objects      对象列表
     * @return 返回连接好的字符串
     */
    public static String concat(boolean nullToIgnore, String separator, Object... objects) {
        if (null == objects || objects.length < 1) {
            return "";
        }
        separator = null == separator ? "" : separator;
        StringBuilder builder = new StringBuilder();
        for (Object obj : objects) {
            if (null == obj) {
                if (!nullToIgnore) {
                    builder.append("null").append(separator);
                }
            } else {
                builder.append(obj).append(separator);
            }
        }
        return builder.toString();
    }

    /**
     * sleep， 不会抛出异常
     *
     * @param millis 毫秒数目
     */
    public static void sleep(int millis) {
        if (millis > 0) {
            try {
                Thread.sleep(millis);
            } catch (InterruptedException ignored) {
            }
        }
    }
}
